home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
assemblr
/
library
/
crc
/
ccit.asm
next >
Wrap
Assembly Source File
|
1986-09-22
|
6KB
|
159 lines
page 74,132
title CRC16 Calculate CRC-16 for data block
; The logic for this method of calculating the CRC 16 bit polynomial
; is taken from an article by David Schwaderer in the April 1985
; issue of PC Tech Journal.
; usage:
; Call CCIT (X$, HICRC%, LOCRC%)
;
; note: For the CCIT routine, do NOT add a word of zeros to the end of the string.
; For the CRC-16 routine, append a word of zeros to the data block.
; Supply '/dcrc16' to create a routine for the CRC-16 polynomial.
;
; author:
; Vern Buerg, Sep 86, for BBSWES
COMPUTE_CRC macro character_reg
xor character_reg, dl ; CRC^c & 0x00FF
mov bl, character_reg ; move into index register
xor bh, bh ; make a full word
shl bx, 1 ; word index
mov dl, dh ; CRC >> 8
xor dh, dh ; (CRC >> 8) & 0x00ff
xor dx, cs:[di][bx] ; (CRC>>8) & 0x00ff) ^ crctab[(CRC^c)&0x00ff]
endm
cseg segment public para 'codesg'
assume cs:cseg
public ccit
ccit proc far
push bp ; save bascom reg
mov bp,sp ; get parmlist ptr
mov si,word ptr 10[bp] ; get X$ vector
mov cx,word ptr [si] ; - string length
mov si,word ptr 2[si] ; - string offset
mov di,offset cs:crctab ; point to the CRC table
sub dx,dx ; initialize crc result
shr cx, 1 ; even or odd?
jnc even_number_of_bytes ; branch if even
; else take care of the odd byte first
lodsb ; get next byte
COMPUTE_CRC al
jcxz Finished_CRC ; branch if no more
even_number_of_bytes: ; walk through the data block
lodsw ; 2 bytes at a time
COMPUTE_CRC al
COMPUTE_CRC ah
loop Even_number_of_bytes
Finished_CRC:
sub ax,ax ; DX has crc value
mov di,word ptr 8[bp] ; offset to HICRC
mov al,dl
stosw ; return hi crc byte
mov di,word ptr 6[bp] ; offset to LOCRC
mov al,dh
stosw ; return low crc byte
pop bp ; recover bascom reg
ret 6 ; clear stack and return
page
even
crctab label word
ifndef crc16
; crc-ccit table = x^16 + x^12 + x^5 + 1
dw 00000h, 02110h, 04220h, 06330h, 08440h, 0A550h, 0C660h, 0E770h
dw 00881h, 02991h, 04AA1h, 06BB1h, 08CC1h, 0ADD1h, 0CEE1h, 0EFF1h
dw 03112h, 01002h, 07332h, 05222h, 0B552h, 09442h, 0F772h, 0D662h
dw 03993h, 01883h, 07BB3h, 05AA3h, 0BDD3h, 09CC3h, 0FFF3h, 0DEE3h
dw 06224h, 04334h, 02004h, 00114h, 0E664h, 0C774h, 0A444h, 08554h
dw 06AA5h, 04BB5h, 02885h, 00995h, 0EEE5h, 0CFF5h, 0ACC5h, 08DD5h
dw 05336h, 07226h, 01116h, 03006h, 0D776h, 0F666h, 09556h, 0B446h
dw 05BB7h, 07AA7h, 01997h, 03887h, 0DFF7h, 0FEE7h, 09DD7h, 0BCC7h
dw 0C448h, 0E558h, 08668h, 0A778h, 04008h, 06118h, 00228h, 02338h
dw 0CCC9h, 0EDD9h, 08EE9h, 0AFF9h, 04889h, 06999h, 00AA9h, 02BB9h
dw 0F55Ah, 0D44Ah, 0B77Ah, 0966Ah, 0711Ah, 0500Ah, 0333Ah, 0122Ah
dw 0FDDBh, 0DCCBh, 0BFFBh, 09EEBh, 0799Bh, 0588Bh, 03BBBh, 01AABh
dw 0A66Ch, 0877Ch, 0E44Ch, 0C55Ch, 0222Ch, 0033Ch, 0600Ch, 0411Ch
dw 0AEEDh, 08FFDh, 0ECCDh, 0CDDDh, 02AADh, 00BBDh, 0688Dh, 0499Dh
dw 0977Eh, 0B66Eh, 0D55Eh, 0F44Eh, 0133Eh, 0322Eh, 0511Eh, 0700Eh
dw 09FFFh, 0BEEFh, 0DDDFh, 0FCCFh, 01BBFh, 03AAFh, 0599Fh, 0788Fh
dw 08891h, 0A981h, 0CAB1h, 0EBA1h, 00CD1h, 02DC1h, 04EF1h, 06FE1h
dw 08010h, 0A100h, 0C230h, 0E320h, 00450h, 02540h, 04670h, 06760h
dw 0B983h, 09893h, 0FBA3h, 0DAB3h, 03DC3h, 01CD3h, 07FE3h, 05EF3h
dw 0B102h, 09012h, 0F322h, 0D232h, 03542h, 01452h, 07762h, 05672h
dw 0EAB5h, 0CBA5h, 0A895h, 08985h, 06EF5h, 04FE5h, 02CD5h, 00DC5h
dw 0E234h, 0C324h, 0A014h, 08104h, 06674h, 04764h, 02454h, 00544h
dw 0DBA7h, 0FAB7h, 09987h, 0B897h, 05FE7h, 07EF7h, 01DC7h, 03CD7h
dw 0D326h, 0F236h, 09106h, 0B016h, 05766h, 07676h, 01546h, 03456h
dw 04CD9h, 06DC9h, 00EF9h, 02FE9h, 0C899h, 0E989h, 08AB9h, 0ABA9h
dw 04458h, 06548h, 00678h, 02768h, 0C018h, 0E108h, 08238h, 0A328h
dw 07DCBh, 05CDBh, 03FEBh, 01EFBh, 0F98Bh, 0D89Bh, 0BBABh, 09ABBh
dw 0754Ah, 0545Ah, 0376Ah, 0167Ah, 0F10Ah, 0D01Ah, 0B32Ah, 0923Ah
dw 02EFDh, 00FEDh, 06CDDh, 04DCDh, 0AABDh, 08BADh, 0E89Dh, 0C98Dh
dw 0267Ch, 0076Ch, 0645Ch, 0454Ch, 0A23Ch, 0832Ch, 0E01Ch, 0C10Ch
dw 01FEFh, 03EFFh, 05DCFh, 07CDFh, 09BAFh, 0BABFh, 0D98Fh, 0F89Fh
dw 0176Eh, 0367Eh, 0554Eh, 0745Eh, 0932Eh, 0B23Eh, 0D10Eh, 0F01Eh
else
; crc-16 table = x^16 + x^15 + x^2 +1
dw 00000H, 0C0C1H, 0C181H, 00140H, 0C301H, 003C0H, 00280H, 0C241H
dw 0C601H, 006C0H, 00780H, 0C741H, 00500H, 0C5C1H, 0C481H, 00440H
dw 0CC01H, 00CC0H, 00D80H, 0CD41H, 00F00H, 0CFC1H, 0CE81H, 00E40H
dw 00A00H, 0CAC1H, 0CB81H, 00B40H, 0C901H, 009C0H, 00880H, 0C841H
dw 0D801H, 018C0H, 01980H, 0D941H, 01B00H, 0DBC1H, 0DA81H, 01A40H
dw 01E00H, 0DEC1H, 0DF81H, 01F40H, 0DD01H, 01DC0H, 01C80H, 0DC41H
dw 01400H, 0D4C1H, 0D581H, 01540H, 0D701H, 017C0H, 01680H, 0D641H
dw 0D201H, 012C0H, 01380H, 0D341H, 01100H, 0D1C1H, 0D081H, 01040H
dw 0F001H, 030C0H, 03180H, 0F141H, 03300H, 0F3C1H, 0F281H, 03240H
dw 03600H, 0F6C1H, 0F781H, 03740H, 0F501H, 035C0H, 03480H, 0F441H
dw 03C00H, 0FCC1H, 0FD81H, 03D40H, 0FF01H, 03FC0H, 03E80H, 0FE41H
dw 0FA01H, 03AC0H, 03B80H, 0FB41H, 03900H, 0F9C1H, 0F881H, 03840H
dw 02800H, 0E8C1H, 0E981H, 02940H, 0EB01H, 02BC0H, 02A80H, 0EA41H
dw 0EE01H, 02EC0H, 02F80H, 0EF41H, 02D00H, 0EDC1H, 0EC81H, 02C40H
dw 0E401H, 024C0H, 02580H, 0E541H, 02700H, 0E7C1H, 0E681H, 02640H
dw 02200H, 0E2C1H, 0E381H, 02340H, 0E101H, 021C0H, 02080H, 0E041H
dw 0A001H, 060C0H, 06180H, 0A141H, 06300H, 0A3C1H, 0A281H, 06240H
dw 06600H, 0A6C1H, 0A781H, 06740H, 0A501H, 065C0H, 06480H, 0A441H
dw 06C00H, 0ACC1H, 0AD81H, 06D40H, 0AF01H, 06FC0H, 06E80H, 0AE41H
dw 0AA01H, 06AC0H, 06B80H, 0AB41H, 06900H, 0A9C1H, 0A881H, 06840H
dw 07800H, 0B8C1H, 0B981H, 07940H, 0BB01H, 07BC0H, 07A80H, 0BA41H
dw 0BE01H, 07EC0H, 07F80H, 0BF41H, 07D00H, 0BDC1H, 0BC81H, 07C40H
dw 0B401H, 074C0H, 07580H, 0B541H, 07700H, 0B7C1H, 0B681H, 07640H
dw 07200H, 0B2C1H, 0B381H, 07340H, 0B101H, 071C0H, 07080H, 0B041H
dw 05000H, 090C1H, 09181H, 05140H, 09301H, 053C0H, 05280H, 09241H
dw 09601H, 056C0H, 05780H, 09741H, 05500H, 095C1H, 09481H, 05440H
dw 09C01H, 05CC0H, 05D80H, 09D41H, 05F00H, 09FC1H, 09E81H, 05E40H
dw 05A00H, 09AC1H, 09B81H, 05B40H, 09901H, 059C0H, 05880H, 09841H
dw 08801H, 048C0H, 04980H, 08941H, 04B00H, 08BC1H, 08A81H, 04A40H
dw 04E00H, 08EC1H, 08F81H, 04F40H, 08D01H, 04DC0H, 04C80H, 08C41H
dw 04400H, 084C1H, 08581H, 04540H, 08701H, 047C0H, 04680H, 08641H
dw 08201H, 042C0H, 04380H, 08341H, 04100H, 081C1H, 08081H, 04040H
endif
ccit endp
cseg ends
end